package com.lx.es.query.test;

import cn.lx.es.query.search.entity.PageList;
import cn.lx.es.query.search.entity.SearchParam;
import cn.lx.es.query.search.service.EsSearchService;
import com.lx.es.query.test.entity.BidprcuDrugInfoSearchDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * 基础数据药品信息搜索演示类
 * 展示改造后的 BidprcuDrugInfoSearchDTO 的使用
 *
 * @author test
 * @date 2025-01-02
 */
@Component
public class BidprcuDrugSearchDemo implements CommandLineRunner {

    @Autowired
    private EsSearchService<BidprcuDrugInfoSearchDTO> esSearchService;

    @Override
    public void run(String... args) throws Exception {
        System.out.println("=== 改造后的BidprcuDrugInfoSearchDTO演示 ===");

        // 演示1: 按药品名称搜索（分词匹配）
        demoSearchByDrugName();

        // 演示2: 按药品代码搜索（精确匹配 + 前缀查询）
        demoSearchByDrugCode();

        // 演示3: 按通用名称搜索（分词匹配）
        demoSearchByGenname();

        // 演示4: 按剂型搜索（精确匹配）
        demoSearchByDosageForm();

        // 演示5: 按给药途径搜索（精确匹配）
        demoSearchByRoute();

        // 演示6: 按药理分类搜索（多值匹配）
        demoSearchByPhamType();

        // 演示7: 按规格名称搜索（分词匹配）
        demoSearchBySpecName();

        // 演示8: 按生产企业搜索（分词匹配）
        demoSearchByManufacturer();

        // 演示9: 按批准文号搜索（精确匹配 + 通配符查询）
        demoSearchByApprovalNumber();

        // 演示10: 搜索基药
        demoSearchEssentialDrugs();

        // 演示11: 搜索医保药品
        demoSearchMedicalInsuranceDrugs();

        // 演示12: 搜索非黑名单药品
        demoSearchNonBlacklistDrugs();

        // 演示13: 复杂搜索（组合条件）
        demoComplexSearch();

        // 演示14: 搜索非黑名单药品
        demoNotInSearch();

        System.out.println("=== 演示完成 ===");
    }

    /**
     * 演示1: 按药品名称搜索（分词匹配）
     */
    private void demoSearchByDrugName() {
        System.out.println("\n--- 演示1: 按药品名称搜索（分词匹配） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setDrugName("阿莫西林"); // 分词匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 药品名称包含'阿莫西林'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
        System.out.println("总页数: " + result.getTotalPages());
    }

    /**
     * 演示2: 按药品代码搜索（精确匹配 + 前缀查询）
     */
    private void demoSearchByDrugCode() {
        System.out.println("\n--- 演示2: 按药品代码搜索（精确匹配 + 前缀查询） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setDrugCode("AMXL"); // 精确匹配 + 前缀查询
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 药品代码='AMXL'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示3: 按通用名称搜索（分词匹配）
     */
    private void demoSearchByGenname() {
        System.out.println("\n--- 演示3: 按通用名称搜索（分词匹配） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setGenname("阿莫西林"); // 分词匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 通用名称包含'阿莫西林'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示4: 按剂型搜索（精确匹配）
     */
    private void demoSearchByDosageForm() {
        System.out.println("\n--- 演示4: 按剂型搜索（精确匹配） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setDosformName("胶囊"); // 精确匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 剂型='胶囊'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示5: 按给药途径搜索（精确匹配）
     */
    private void demoSearchByRoute() {
        System.out.println("\n--- 演示5: 按给药途径搜索（精确匹配） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setRuteName("口服"); // 精确匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 给药途径='口服'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示6: 按药理分类搜索（多值匹配）
     */
    private void demoSearchByPhamType() {
        System.out.println("\n--- 演示6: 按药理分类搜索（多值匹配） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setPhamTypeName1("抗生素,抗病毒"); // 多值匹配，支持逗号分隔
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 药理分类为'抗生素'或'抗病毒'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示7: 按规格名称搜索（分词匹配）
     */
    private void demoSearchBySpecName() {
        System.out.println("\n--- 演示7: 按规格名称搜索（分词匹配） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setSpecName("0.25g"); // 分词匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 规格名称包含'0.25g'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示8: 按生产企业搜索（分词匹配）
     */
    private void demoSearchByManufacturer() {
        System.out.println("\n--- 演示8: 按生产企业搜索（分词匹配） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setProdentpName("华北制药"); // 分词匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 生产企业包含'华北制药'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示9: 按批准文号搜索（精确匹配 + 通配符查询）
     */
    private void demoSearchByApprovalNumber() {
        System.out.println("\n--- 演示9: 按批准文号搜索（精确匹配 + 通配符查询） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setAprvno("国药准字H*"); // 精确匹配 + 通配符查询
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 批准文号='国药准字H*'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示10: 搜索基药
     */
    private void demoSearchEssentialDrugs() {
        System.out.println("\n--- 演示10: 搜索基药 ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setEssdrugFlag("1"); // 假设1表示基药
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 基药标志='1'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示11: 搜索医保药品
     */
    private void demoSearchMedicalInsuranceDrugs() {
        System.out.println("\n--- 演示11: 搜索医保药品 ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setHiType("1"); // 假设1表示医保药品
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 医保标志='1'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示12: 搜索非黑名单药品
     */
    private void demoSearchNonBlacklistDrugs() {
        System.out.println("\n--- 演示12: 搜索非黑名单药品 ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setBklsFlag("0"); // 假设0表示非黑名单
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 黑名单标志='0'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    /**
     * 演示13: 复杂搜索（组合条件）
     */
    private void demoComplexSearch() {
        System.out.println("\n--- 演示13: 复杂搜索（组合条件） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setDrugName("阿莫西林"); // 药品名称包含
        searchDTO.setProdentpName("华北制药"); // 生产企业包含
        searchDTO.setDosformName("胶囊"); // 剂型精确匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 药品名称包含'阿莫西林' AND 生产企业包含'华北制药' AND 剂型='胶囊'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }

    private void demoNotInSearch() {
        System.out.println("\n--- 演示14: 复杂搜索（组合条件） ---");

        BidprcuDrugInfoSearchDTO searchDTO = new BidprcuDrugInfoSearchDTO();
        searchDTO.setDrugName("阿莫西林"); // 药品名称包含
        searchDTO.setProdentpName("华北制药"); // 生产企业包含
        searchDTO.setDosformName("胶囊"); // 剂型精确匹配
        searchDTO.setCurrentPage(1);
        searchDTO.setPageSize(10);

        SearchParam<BidprcuDrugInfoSearchDTO> searchParam = new SearchParam<>(searchDTO);
        PageList<BidprcuDrugInfoSearchDTO> result = esSearchService.search(searchParam, BidprcuDrugInfoSearchDTO.class);

        System.out.println("搜索条件: 药品名称不包含'阿莫西林' AND 生产企业包含'华北制药' AND 剂型='胶囊'");
        System.out.println("搜索结果数量: " + result.getTotalElements());
    }



}
